package br.com.brasileirao.factory;

import org.hibernate.Session;

import br.com.brasileirao.dao.ApacHibernateDao;
import br.com.brasileirao.dao.CidadeHibernateDao;
import br.com.brasileirao.dao.ClubeHibernateDao;
import br.com.brasileirao.dao.EnderecoHibernateDao;
import br.com.brasileirao.dao.GenericHibernateDAO;
import br.com.brasileirao.dao.HibernateUtil;

/**
 * 
 * @author helder
 *
 */
public class HibernateDAOFactory extends DAOFactory {
	
	private static ClubeHibernateDao clubeHibernateDao;
	private static ApacHibernateDao apacHibernateDao;
	private static CidadeHibernateDao cidadeHibernateDao;
	private static EnderecoHibernateDao enderecoHibernateDao;
 
    /**
     * 
     * @param daoClass
     * @return
     */
    private static GenericHibernateDAO instantiateDAO(Class daoClass) {
        try {
            GenericHibernateDAO dao = (GenericHibernateDAO)daoClass.newInstance();
            dao.setSession(HibernateUtil.getSession());
            return dao;
        } catch (Exception ex) {
            throw new RuntimeException("Can not instantiate DAO: " + daoClass, ex);
        }
    }
 
    /**
     * 
     * @return
     */
    public static ClubeHibernateDao getClubeHibernateDao() {
    	if (clubeHibernateDao == null)
    		return (ClubeHibernateDao)instantiateDAO(ClubeHibernateDao.class);
    	return clubeHibernateDao;
    }
    
    /**
     * 
     * @return
     */
    public static ApacHibernateDao getApacHibernateDao() {
    	if (apacHibernateDao == null)
    		return (ApacHibernateDao)instantiateDAO(ApacHibernateDao.class);
    	return apacHibernateDao;
    }
    
    /**
     * 
     * @return
     */
    public static CidadeHibernateDao getCidadeHibernateDao() {
    	if (cidadeHibernateDao == null)
    		return (CidadeHibernateDao)instantiateDAO(CidadeHibernateDao.class);
    	return cidadeHibernateDao;
    }
    
    public static EnderecoHibernateDao getEnderecoHibernateDao() {
    	if (enderecoHibernateDao == null)
    		return (EnderecoHibernateDao)instantiateDAO(EnderecoHibernateDao.class);
    	return enderecoHibernateDao;
    }
 
}
